import 'dart:developer' as developer;

/// Elegance控件库的日志系统
/// 
/// 这个文件定义了日志记录相关的类和工具，用于统一管理控件库的日志输出

/// 日志级别枚举
enum EleganceLogLevel {
  /// 详细信息，通常用于开发调试
  verbose,
  
  /// 调试信息
  debug,
  
  /// 普通信息
  info,
  
  /// 警告信息
  warning,
  
  /// 错误信息
  error,
  
  /// 致命错误信息
  critical,
  
  /// 关闭所有日志
  off,
}

/// Elegance日志记录器
/// 
/// 提供统一的日志记录功能，支持不同级别的日志输出
class EleganceLogger {
  /// 创建日志记录器实例
  factory EleganceLogger(String tag) {
    return _loggers.putIfAbsent(tag, () => EleganceLogger._internal(tag));
  }

  EleganceLogger._internal(this.tag);

  /// 日志标签
  final String tag;

  /// 所有日志记录器的实例缓存
  static final Map<String, EleganceLogger> _loggers = {};

  /// 全局日志级别
  static EleganceLogLevel globalLogLevel = EleganceLogLevel.info;

  /// 设置全局日志级别
  static void setGlobalLogLevel(EleganceLogLevel level) {
    globalLogLevel = level;
  }

  /// 详细信息日志
  void verbose(String message, [Object? error, StackTrace? stackTrace]) {
    if (_shouldLog(EleganceLogLevel.verbose)) {
      _log('VERBOSE', message, error, stackTrace);
    }
  }

  /// 调试信息日志
  void debug(String message, [Object? error, StackTrace? stackTrace]) {
    if (_shouldLog(EleganceLogLevel.debug)) {
      _log('DEBUG', message, error, stackTrace);
    }
  }

  /// 普通信息日志
  void info(String message, [Object? error, StackTrace? stackTrace]) {
    if (_shouldLog(EleganceLogLevel.info)) {
      _log('INFO', message, error, stackTrace);
    }
  }

  /// 警告信息日志
  void warning(String message, [Object? error, StackTrace? stackTrace]) {
    if (_shouldLog(EleganceLogLevel.warning)) {
      _log('WARNING', message, error, stackTrace);
    }
  }

  /// 错误信息日志
  void error(String message, [Object? error, StackTrace? stackTrace]) {
    if (_shouldLog(EleganceLogLevel.error)) {
      _log('ERROR', message, error, stackTrace);
    }
  }

  /// 致命错误信息日志
  void critical(String message, [Object? error, StackTrace? stackTrace]) {
    if (_shouldLog(EleganceLogLevel.critical)) {
      _log('CRITICAL', message, error, stackTrace);
    }
  }

  /// 判断是否应该记录指定级别的日志
  bool _shouldLog(EleganceLogLevel level) {
    return level.index >= globalLogLevel.index && globalLogLevel != EleganceLogLevel.off;
  }

  /// 实际的日志记录实现
  void _log(String level, String message, Object? error, StackTrace? stackTrace) {
    final logMessage = '[Elegance] [$tag] [$level] $message';
    
    if (error != null) {
      developer.log(logMessage, error: error, stackTrace: stackTrace);
    } else {
      developer.log(logMessage);
    }
  }
}

/// 全局日志记录器
/// 
/// 提供方便的全局日志访问
class GlobalEleganceLogger {
  /// 获取全局日志记录器
  static EleganceLogger get logger => EleganceLogger('Global');

  /// 设置全局日志级别
  static void setLogLevel(EleganceLogLevel level) {
    EleganceLogger.setGlobalLogLevel(level);
  }

  /// 详细信息日志
  static void verbose(String message, [Object? error, StackTrace? stackTrace]) {
    logger.verbose(message, error, stackTrace);
  }

  /// 调试信息日志
  static void debug(String message, [Object? error, StackTrace? stackTrace]) {
    logger.debug(message, error, stackTrace);
  }

  /// 普通信息日志
  static void info(String message, [Object? error, StackTrace? stackTrace]) {
    logger.info(message, error, stackTrace);
  }

  /// 警告信息日志
  static void warning(String message, [Object? error, StackTrace? stackTrace]) {
    logger.warning(message, error, stackTrace);
  }

  /// 错误信息日志
  static void error(String message, [Object? error, StackTrace? stackTrace]) {
    logger.error(message, error, stackTrace);
  }

  /// 致命错误信息日志
  static void critical(String message, [Object? error, StackTrace? stackTrace]) {
    logger.critical(message, error, stackTrace);
  }
}

/// 日志记录混入
/// 
/// 为控件提供日志记录能力
mixin LoggableMixin {
  /// 获取日志记录器
  EleganceLogger get logger {
    final tag = runtimeType.toString();
    return EleganceLogger(tag);
  }

  /// 详细信息日志
  void logVerbose(String message, [Object? error, StackTrace? stackTrace]) {
    logger.verbose(message, error, stackTrace);
  }

  /// 调试信息日志
  void logDebug(String message, [Object? error, StackTrace? stackTrace]) {
    logger.debug(message, error, stackTrace);
  }

  /// 普通信息日志
  void logInfo(String message, [Object? error, StackTrace? stackTrace]) {
    logger.info(message, error, stackTrace);
  }

  /// 警告信息日志
  void logWarning(String message, [Object? error, StackTrace? stackTrace]) {
    logger.warning(message, error, stackTrace);
  }

  /// 错误信息日志
  void logError(String message, [Object? error, StackTrace? stackTrace]) {
    logger.error(message, error, stackTrace);
  }

  /// 致命错误信息日志
  void logCritical(String message, [Object? error, StackTrace? stackTrace]) {
    logger.critical(message, error, stackTrace);
  }
}